package com.hliushi.learn.job;

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.hliushi.learn.model.FileCustom;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件备份任务
 * 次任务在每次执行时获取一定数目的文件, 进行备份处理
 * 由File实体类的backedUp属性来标识该文件是否已经备份
 *
 * @author llhuang10
 * @date 2021/8/16 21:56
 */
@Slf4j
public class FileBackupJob implements SimpleJob {


    /**
     * 文件列表
     */
    public static List<FileCustom> files = new ArrayList<>();
    /**
     * 每次任务执行要备份文件的数量
     */
    private final int FETCH_SIZE = 1;

    /**
     * 任务执行代码逻辑
     *
     * @param shardingContext
     */
    @Override
    public void execute(ShardingContext shardingContext) {
        // 作业分片信息
        //  shardingItem -> 分配于本作业实例的分片项
        int shardingItem = shardingContext.getShardingItem();
        log.info("作业分片：{}", shardingItem);
        // 获取未备份的文件
        List<FileCustom> fileCustoms = fetchUnBackupFiles(FETCH_SIZE);

        // 文件备份
        backupFiles(fileCustoms);
    }

    /**
     * 获取未备份的文件
     *
     * @param count 文件数量
     * @return
     */
    public List<FileCustom> fetchUnBackupFiles(int count) {

        // 要获取的文件列表
        List<FileCustom> tmpFiles = new ArrayList<>();
        int num = 0;


        // todo stream流式方式
        for (FileCustom file : files) {
            if (num >= count) {
                break;
            }
            // 为备份的文件则放入列表
            if (!Boolean.TRUE.equals(file.getBackedUp())) {
                tmpFiles.add(file);
                num++;
            }
        }

        log.info("time: {}, 获取文件{}个\n", LocalDateTime.now(), num);
        return tmpFiles;
    }

    /**
     * 备份文件
     *
     * @param files
     */
    public void backupFiles(List<FileCustom> files) {
        files.forEach(item -> {
            item.setBackedUp(true);
            log.info("time:{} 已备份文件:{}, 文件类型:{}\n", LocalDateTime.now(), item.getName(), item.getType());

        });
    }
}
